PHP cookies
Home

PHP cookies

PHP cookies

Een computercookie, algemeen bekend als een HTTP-cookie of webcookie, is een klein tekstbestand waarin kleine stukjes informatie opslagen wordt. Ze worden gemaakt door de websites die je bezoekt en worden op je computer opgeslagen.

Het gaat meestal o een soort trackinginformatie die de website helpt bij het uitvoeren van verschillende taken, zoals het beheren van een sessie-ID wanneer je je aanmeldt. Cookies zijn maximum 4 kB groot, ze kunnen dus geen grote hoeveelheden gegevens bevatten.

In dit lesonderdeel leer je cookies in je programma's instelt, leest en verwijdert.

Geschiedenis van de cookies

Soorten cookies

Er zijn drie verschillende soorten cookies, met elk een specifiek doel:

  1. Sessiecookies zijn tijdelijke cookies. Ze worden gemaakt tijdens één enkele sessie en verdwijnen weer zodra je de browser sluit. Het zijn first-party cookies en het beheer ervan ligt volledig in handen ligt in de handen van de website. De gebruiker kan sessiecookies niet uitschakelen vanuit zijn browser.

    Sessiecookies worden doorgaans gebruikt door overheidswebsites en online banken. Ze houden uw browsesessie bij terwijl u actief op de site navigeert. Zodra u de browser sluit, vervallen de cookies automatisch.

    Dit voorkomt dat kwaadwillende gebruikers met jouw opgeslagen sessiegegevens de website op een later tijdstip kunnen bezoeken.

  2. Permanente cookies verlopen niet nadat je de browser hebt gesloten of zelfs de computer heb uitgezet. Daarom worden ze worden permanente cookies of tracking cookies genoemd.

    Ze hebben een vervaldatum die is ingesteld door de website en blijven tot dan geldig.
    Permanente cookies helpen gebruikers om hun eerdere aanmeldingen bij te houden, zodat ze niet elke keer dat ze een website bezoeken gebruikersnaam en wachtwoorden moeten invoeren.

    Hoewel de mogelijkheid 'houd mij aangemeld' of 'onthoud mij' op websites handig is, is het niet bepaald veilig. Het laat mensen met kwaadaardige bedoelingen toe om op de een of andere manier toegang te krijgen tot je computer.

    Je kan ervoor kiezen om cookies uit te schakelen maar dat beperkt de mogelijkheid om door de website te navigeren, aangezien, zoals hierboven vermeld, cookies worden gebruikt om de sessies van gebruikers bij te houden, zodat ke bijvoorbeeld geen toegang krijgt tot het klantgedeelte of je telkens weer moet aanmelden.

    Een tussenoplossing bestaat erin dat je cookies toestaat ​​en dat je om voorkomen dat je gegevens worden misbruikt, nu en dan het cachegeheugen van je browser wist.

  3. Cookies van derden (third-party) zijn bekend als marketing- of trackingcookies. Third-party cookies worden niet door de websitebeheerder gegenereerd, maar door een derde partij door middel van van advertenties, of iets dergelijks. Cookies van derden verzamelen voornamelijk marketingrelevante informatie, zoals gegevens over leeftijd, afkomst, geslacht en gebruikersgedrag, en door deze verzameling zijn ze krachtige online marketingtools, vooral voor gepersonaliseerde advertenties.

    Daar komt het dat je bij het bezoeken van een website soms een banner of advertentie van een product ziet, dat je eerder ergens anders hebt bekeken.

    Hoewel adverteerders beweren dat hun doel duidelijk is om gebruikers een persoonlijkere ervaring te bieden, vinden de meeste mensen deze tracking cookies een inbreuk op hun privacy en beschouwen ze het als illegaal. Google, Facebook, YouTube en Twitter zijn enkele van de meest voorkomende websites die cookies van derden gebruiken.

Cookies in PHP

De PHP-engine gebruikt een cookie om een link tussen een bepaalde webclient en de webserver te creëren en te onthouden. Daarmee worden je webpagina's stateful.

Eén keer die cookie door de PHP-engine is gecreëerd en verstuurd, wordt deze cookie samen met het verzoek meegestuurd elke keer dat een webclient een verzoek indient.

De engine leest de cookie en komt erachter dat een bepaald verzoek afkomstig is van dezelfde webclient die eerdere verzoeken heeft gedaan, die door dezelfde cookie werden vergezeld.

Een cookie heeft een naam, bijvoorbeeld "klant" en een waarde, bijvoorbeeld "54678" of "Hana").

Eén cookie dient één stukje informatie bij te houden. Als je meer dan 1 item over een gebruiker wenst bij te houden, bijvoorbeeld de inhoud van het winkelwagentje van die gebruiker, is het niet aan te raden hiervoor meerdere cookies te gebruiken. Dan gebruik je beter 1 cookie samen met de sessiemogelijkheden van PHP.

Een sessie gebruikt één cookie om gebruikers van elkaar te onderscheiden en maakt het mogelijk om voor elke gebruiker meerdere gegevens op de server te bewaren. Deze gegevens blijven over alle verzoeken heen bestaan. Meer over sessies vind je op PHP sessies.

Werken met cookies in PHP

Gebruik de functie setcookie om een cookie in te stellen. Dit zorgt ervoor dat de webclient een cookienaam en -waarde onthoudt en deze bij volgende verzoeken terug te sturen naar de server.

Het volgende statement stelt een cookie met de naam user in op de waarde Kees:

setcookie ('user', 'Kees');

Gebruik de $ _COOKIE autoglobal om een eerder ingestelde cookie uit te lezen:
array. Om de waarde van de user-cookie weer te geven:

echo 'Hallo'. $ _COOKIE ['user'];

De waarde voor een cookie die je aan setcookie meegeeft, kan een tekenreeks of een getal zijn. Het mag geen array of meer gecompliceerde gegevensstructuur zijn.

De functie setcookie URL-codeert de cookiewaarde voordat deze naar de webclient wordt verzonden. Dit betekent dat een spatie wordt omgezet in een +, en alle tekens, die geen letters, cijfers, onderstrepingstekens, koppeltekens en punten zijn, omgezet worden in een procentteken gevolgd door de ASCII-waarde in hexadecimaal.

Als je niet wilt dat PHP uw cookiewaarde URL-codeert, gebruik dan setrawcookie in plaats van setcookie. Met setrawcookie mag de cookiewaarde geen =, ,,; of witruimte bevatten.

https://stackoverflow.com/questions/39860045/how-do-i-use-cookies-to-store-shopping-cart-content

Oefening

Gebruik de code in dit voorbeeld niet in een productiewebsite. Deze code is niet veilig en dient alleen om te leren werken met cookies!

We maken een pseudo-webshop, een login pagina en een pagina waarop je boeken kan bestellen. We houden de aangemelde gebruiker bij. Elk besteld boek wordt in een 'winkelwagentje' gestopt.

Overzicht

Als je de functie setcookie aanroept, bevat het antwoord dat de PHP-engine genereert om terug te sturen naar de webclient, een speciale header die de webclient vertelt over de nieuwe cookie. Bij volgende verzoeken verzendt de webclient die cookienaam en waarde terug naar de server:

PHP setcookie flow
PHP setcookie flow

Stappenplan

  1. Maak een map met de naam cookies-sessions in de webroot.
  2. Maak een index.php pagina:
    1. plaats daarin een login form. Als de gebruiker op de Aanmelden knop klikt wordt dezelfde pagina op de server aangevraagd:
      <form class="logging-in" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
          <div class="field">
              <label for="user-name">Gebruikersnaam: </label>
              <input id="user-name" name="user-name" class="text" type="text" required/>
          </div>
          <button type="submit" name="submit" id="login" value="login">Aanmelden</button>
      </form>
    2. bovenaan de pagina:
      <?php
      // kijk als in de request een userName cookie werd meegestuurd:
      1$userName = isset($_COOKIE['userName']) ? $_COOKIE['userName'] : null;
      // als op de submit knop werd gedklikt moet je de persoon aanmelden
      2if ($_SERVER['REQUEST_METHOD'] === 'POST') {
      3    if ($_POST['submit'] == 'login') {
              // setcookie: er wordt een cookie meegestuurd naar de client
              // de request die net binnenkwam van de client naar de server
              // bevat geen cookie, die zal slechts de volgende keer
              // dat de request wordt ingediend meegestuurd worden.
              $userName = $_POST['user-name'];
              setcookie('userName', $userName);
          } 4elseif ($_POST['submit'] == 'logout') {
              // There is no specific function for deleting a cookie in PHP.
              // However, we recommend you to use the PHP setcookie() function
              // mentioning the expiration date in the past as demonstrated below:
              setcookie("userName", "", time() - 3600);
              $userName = null;
          }
      }
      ?>
      1. checken we als de cookie met de naam userName al bestaat, als die bestaat is de gebruiker al aangemeld en slaan we de naam op in de $userName variabele anders stellen we de variabele in op null
      2. checken we als de pagina werd aangevraagd door op de Aanmelden of Afmelden knop te drukken, dan doen we door naar de waarde van $_SERVER['REQUEST_METHOD'] te kijken
      3. indien op de Aanmelden knop werd gedrukt slaan we de ingetype naam op in de variabele $userName en maken we een cookie met de sleutel userName en de waarde van de variabele $userName
      4. indien op de Afmelden knop werd gedrukt vernietigen we de cookie en stellen de $userName variabele in op null
    3. Na de form zeg je welkom:
      <h1>Welkom</h1>
    4. Vervolgens:
      <?php
      1if (isset($userName)) { ?>
        2<p><?php echo $userName; ?></p>
        3<form class="logging-out" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
               4<button type="submit" name="submit" id="logout" value="logout">Afmelden</button>
           </form>
       5 <a href="catalog.php">Ga naar boekencataloog</a>
          <?php
      }
      ?>
      1. Als de gebruiker is aangemeld ($userName is niet gelijk aan null) tonen we het volgende:
      2. de naam
      3. een form die dezelfde pagina op de server oproept als op de submit knop wordt geklikt
      4. een aanmeldingsknop
      5. een link naar de boekencatalogus
  3. Maak de catalog.php pagina:
    <?php
    // deze code dient om te leren werken met cookies en moet je niet in
    // een productiewebsite gebruiken!
    // kijk als in de request een shopping-cart cookie werd meegestuurd:
    1$shoppingCart = isset($_COOKIE['shoppingCart']) ? $_COOKIE['shoppingCart'] : null;
    2if ($_SERVER["REQUEST_METHOD"] == "POST") {
        2.1if (isset($_POST['shopping-cart']) && $_POST['shopping-cart'] === 'empty') {
            // There is no specific function for deleting a cookie in PHP.
            // However, we recommend you to use the PHP setcookie() function
            // mentioning the expiration date in the past as demonstrated below:
            setcookie("shoppingCart", "", time() - 3600);
            $shoppingCart = null;
    
        } 2.2elseif (isset($_POST['order'])) {
            // zat er al iets in de shopping-cart cookie?
            2.2.1if (isset($shoppingCart)) {
                $shoppingCart .= ', ' . $_POST['order'];
            } 2.2.2else {
                $shoppingCart = $_POST['order'];
            }
            2.3setcookie('shoppingCart', $shoppingCart);
        }
    }
    ?>
    1. als de catalog.php pagina op de webserver opgevraagd wordt kijken we eerst of er een cookie werd meegestuurd met de inhoud van de winkelwagen; als er een shoppingCart cookie werd meegestuurd slaan de waarde op in de variabele $shoppingCart anders is de variabele gelijk aan null;
    2. als de catalog.php pagina op de webserver opgevraagd wordt door op een submit knop te klikken (POST) zijn er twee mogelijkheden:
      1. als er op de Afmelden knop geklikt werd zit er shopping-cart sleutel met waarde empty in de globale $_POST array en dan verwijderen we de shoppingCart cookie;
      2. als er op een bestel knop werd geklikt zit er een order sleutel met als waarde de titel en de auteur van het boek in de globale $_POST array dan zijn er weer twee mogelijkheden:
        1. er zitten al boeken in de $shoppingCart variable, in dat geval plakken we het nieuw bestelde boek aan de reeds bestelde boeken, die in de variabele $shoopingCart staan, voorafgegaan door een komma;
        2. is de $shoppingCart variabele is null, stoppen we de gegevens van het bestelde boek in de $shoppingCart variabele
      3. we plaatsen de waarde van de geüpdate $shoppingCart variabele in de shoppingCart cookie
  4. Dan volgt de HTML
    <!doctype html>
    
    1<html lang="nl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        2<title>Boekencataloog - werken met cookies</title>
    </head>
    <body>
    3<h1>Boekencataloog</h1>
    4<h2>Welkom <?php echo isset($_COOKIE['userName']) ? $_COOKIE['userName'] : 'Je bent niet aangemeld.'; ?></h2>
    5<p>Je bestellingen:</p>
    6<p><?php echo isset($shoppingCart) ? $shoppingCart : 'Nog geen boeken besteld.'; ?></p>
    7<button type="submit" name="shopping-cart" id="empty" value="empty"
            form="catalog-form">Winkelkar leegmaken
    </button>
    8<h3>Bestel een boek</h3>
    9<form method="post" id="catalog-form" name="catalog-form"
          action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
        <div>
            10.1<label for="book-1">Herman Portocarero, De zwarte handel</label>
            10.2<button id="book-1" name="order" value="Herman Portocarero, De zwarte handel">Bestel</button>
        </div>
        <div>
            10.1<label for="book-2">Aristophanes, Ploutos de god van het geld</label>
            10.2<button id="boek-2" name="order" value="Aristophanes, Ploutos de god van het geld">Bestel</button>
        </div>
        <div>
            10.1<label for="book-3">Steve Prettyman, Learn PHP 8</label>
            10.2<button id="prettyman" name="order" value="Steve Prettyman, Learn PHP 8">Bestel</button>
        </div>
        <div>
            10.1<label for="daudet">Alphonse Daudet, Brieven uit mijn molen</label>
            10.2<button id="daudet" name="order" value="Alphonse Daudet, Brieven uit mijn molen">Bestel</button>
        </div>
    </form>
    11<a href="index.php">Terug naar de index pagina</a>
    </body>
    </html>
    1. we beginnen met de taal in te stellen die in de webpagina gebruikt wordt, namelijk het Nederlands;
    2. we geven een waarde aan het title element in het head element
    3. we voegen een koptekst toe met daarin de tekst Boekencataloog
    4. we voegen een tussentitel toe met daarin, als er een userName cookie is meegestuurd, de naam van de gebruiker en anders een boodschap dat er nog niemand is aangemeld;
    5. we voegen een paragraaf toe met de tekst Je bestellingen;
    6. we kijken als er iets in de variabele $shoppingCart staat, indien zo tonen we de lijst van de bestelde boeken anders een boodschap dat er nog geen boeken besteld zijn;
    7. we voegen een button element toe om de winkelkar te legen; het is een submit knop, het name attribuut stellen we in op shopping-cart, het value attribuut op empty en het form attribuut op de id van de form die we straks nog geen toevoegen;
    8. we voegen een subtitel toe met de tekst Bestel een boek;
    9. we voegen een form toe die wanneer op een submit knop wordt geklikt, dezelfde pagina, namelijk catalog.php op de webserver zal opvragen met een POST; 2.1van de codeblok in het vorige punt zal worden uitgevoerd;
    10. voor elk te bestellen boek voegen:
      1. een label element toe waarvan het for attribuut ingesteld is op de id van het overeenkomstige buttom element
      2. een buttom element toe waarvan het id attribuut ingesteld is op auteur-n, een auteur volgnummer, het name attribuut op order en het value attribuut op de naam van de auteur en de titel van het boek; 2.2van de codeblok in het vorige punt zal worden uitgevoerd;
    11. tenslotte voegen een we link toe om terug te keren naar de index.php pagina;
  5. Een overzicht van de opeenvolgende HTTP requests:
    1. eerste verzoek
      PHP oefening setcookie eerste verzoek
      PHP oefening setcookie eerste verzoek
    2. tweede verzoek
      PHP oefening setcookie tweede verzoek
      PHP oefening setcookie tweede verzoek
    3. derde verzoek
      PHP oefening setcookie derde verzoek
      PHP oefening setcookie derde verzoek
    4. vierde verzoek
      PHP oefening setcookie vierde verzoek
      PHP oefening setcookie vierde verzoek
    5. vijfde verzoek
      PHP oefening setcookie vijfde verzoek
      PHP oefening setcookie vijfde verzoek
  6. De volledige code
    1. index.php
      <?php
      // kijk als in de request een userName cookie werd meegestuurd:
      $userName = isset($_COOKIE['userName']) ? $_COOKIE['userName'] : null;
      // als op de submit knop werd gedklikt moet je de persoon aanmelden
      if ($_SERVER['REQUEST_METHOD'] === 'POST') {
          if ($_POST['submit'] == 'login') {
              // setcookie: er wordt een cookie meegestuurd naar de client
              // de request die net binnenkwam van de client naar de server
              // bevat geen cookie, die zal slechts de volgende keer
              // dat de request wordt ingediend meegestuurd worden.
              $userName = $_POST['user-name'];
              setcookie('userName', $userName);
          } elseif ($_POST['submit'] == 'logout') {
              // There is no specific function for deleting a cookie in PHP.
              // However, we recommend you to use the PHP setcookie() function
              // mentioning the expiration date in the past as demonstrated below:
              setcookie("userName", "", time() - 3600);
              $userName = null;
          }
      }
      ?>
      <!doctype html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport"
                content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Werken met cookies - logging in</title>
      </head>
      <body>
      <form class="logging-in" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
          <div class="field">
              <label for="user-name">Gebruikersnaam: </label>
              <input id="user-name" name="user-name" class="text" type="text" required/>
          </div>
          <button type="submit" name="submit" id="login" value="login">Aanmelden</button>
      </form>
      <h1>Welkom</h1>
      
      <?php
      if (isset($userName)) { ?>
          <p><?php echo $userName; ?></p>
          <form class="logging-out" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
              <button type="submit" name="submit" id="logout" value="logout">Afmelden</button>
          </form>
          <a href="catalog.php">Ga naar boekencataloog</a>
          <?php
      }
      ?>
      </body>
      </html>
    2. catalog.php
      <?php
      // deze code dient om te leren werken met cookies en moet je niet in
      // een productiewebsite gebruiken!
      // kijk als in de request een shopping-cart cookie werd meegestuurd:
      $shoppingCart = isset($_COOKIE['shoppingCart']) ? $_COOKIE['shoppingCart'] : null;
      if ($_SERVER["REQUEST_METHOD"] == "POST") {
          if (isset($_POST['shopping-cart']) && $_POST['shopping-cart'] === 'empty') {
              // There is no specific function for deleting a cookie in PHP.
              // However, we recommend you to use the PHP setcookie() function
              // mentioning the expiration date in the past as demonstrated below:
              setcookie("shoppingCart", "", time() - 3600);
              $shoppingCart = null;
      
          } elseif (isset($_POST['order'])) {
              // zat er al iets in de shopping-cart cookie?
              if (isset($shoppingCart)) {
                  $shoppingCart .= ', ' . $_POST['order'];
              } else {
                  $shoppingCart = $_POST['order'];
              }
              setcookie('shoppingCart', $shoppingCart);
          }
      }
      ?>
      <!doctype html>
      <html lang="nl">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport"
                content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Boekencataloog - werken met cookies</title>
      </head>
      <body>
      <h1>Boekencataloog</h1>
      <h2>Welkom <?php echo isset($_COOKIE['userName']) ? $_COOKIE['userName'] : 'Je bent niet aangemeld.'; ?></h2>
      <p>Je bestellingen:</p>
      <p><?php echo isset($shoppingCart) ? $shoppingCart : 'Nog geen boeken besteld.'; ?></p>
      <button type="submit" name="shopping-cart" id="empty" value="empty"
              form="catalog-form">Winkelkar leegmaken
      </button>
      <h3>Bestel een boek</h3>
      <form method="post" id="catalog-form" name="catalog-form"
            action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
          <div>
              <label for="book-1">Herman Portocarero, De zwarte handel</label>
              <button id="book-1" name="order" value="Herman Portocarero, De zwarte handel">Bestel</button>
          </div>
          <div>
              <label for="book-2">Aristophanes, Ploutos de god van het geld</label>
              <button id="boek-2" name="order" value="Aristophanes, Ploutos de god van het geld">Bestel</button>
          </div>
          <div>
              <label for="book-3">Steve Prettyman, Learn PHP 8</label>
              <button id="prettyman" name="order" value="Steve Prettyman, Learn PHP 8">Bestel</button>
          </div>
          <div>
              <label for="daudet">Alphonse Daudet, Brieven uit mijn molen</label>
              <button id="daudet" name="order" value="Alphonse Daudet, Brieven uit mijn molen">Bestel</button>
          </div>
      </form>
      <a href="index.php">Terug naar de index pagina</a>
      </body>
      </html>

JI
2021-04-11 17:39:40